package com.cremamobile.filemanager.device;

import java.io.File;

import android.annotation.SuppressLint;
import android.os.Build;
import android.os.StatFs;
import android.util.Pair;

/**
 * Miniklasse zum Ermitteln einer Partitions-Gr��e, die auch mit alten Android-Versionen 
 * zusammen klappt und ab Gingerbread die File-Methoden benutzt. Sie nutzt ein {@link Pair} zum 
 * Speichern der Informationen, wobei gilt:
 * <ul>
 * <li>first: freier Speicher (free), ermittelt per getUsableSpace
 * <li>secondary: Gesamtspeicher (size), ermittelt per getTotalSpace
 * </ul>
 * Der Constructor der Klasse ist privat, erzeugt wird ein Objekt �ber die statische
 * Funktion getSpace(File).
 * 
 * @see DeviceUtils
 * @author	J�rg Wirtgen (jow@ct.de)
 * @version	1.0 (3. Okt 12)
 */
public class Size extends Pair<Long,Long> {
	
	private Size(long free, long size) { super(free, size); }

	public long guessSize(long num) {
		if (num==0) return 0;
		long g;
		if (num>1024*1024*1024) g = 1024*1024*1024;
		else if (num>1024*1024) g = 1024*1024;
		else g = 1;
		while (num>g) g *= 2;
		return g;
	}

	public long getSpace() {
		return first;
	}
	
	public long getTotal() {
		return second;
	}
	
	public int getPercent() {
		return (int) ((first * 100)/second);
	}
	
	public static Size getSpace(File f) {
		if (f == null)
			return new Size((long)0, (long)0);
		
		StatFs stat = new StatFs(f.getAbsolutePath());
		
		long available = 0, total = 0;
		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
//			@SuppressWarnings("deprecation")
			available = (long)stat.getAvailableBlocksLong() * (long)stat.getBlockSizeLong();
			total = (long)stat.getBlockCountLong() * (long)stat.getBlockSizeLong();
		} else{
//			@SuppressWarnings("deprecation")
			available = (long)((double)stat.getAvailableBlocks() * (double)stat.getBlockSize());
			total = (long)((double)stat.getBlockCount() * (double)stat.getBlockSize());
		}
		return new Size(available, total);
	}
}